﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace WebApp.DAL
{
    public class ContextFactory
    {
        public const string Session_USER_ID = "userid";
        public const string Session_USER_NAME = "username";

        //关于DbContext的单例问题，看了一些文章讲DbContex是轻量级的，创建的开销不大，另一个DbContext并不能保证线程安全。
        //对于DbContext单例化、静态化很多人反对，但每个操作都进行创建和销毁也不合理，实现一个请求内单例还是比较合适。
        //看到@Kencery这么写，我特意查了些资料：MSDN中讲CallContext提供对每个逻辑执行线程都唯一的数据槽，而在WEB程序里，每一个请求就是一个逻辑线程
        //所以使用CallContext来实现单个请求之内的DbContext单例是合理的。

        /// <summary>
        /// 获取当前数据上下文
        /// </summary>
        /// <returns></returns>
        public static WebApp.Models.dbEntities GetCurrentContext()
        {
            WebApp.Models.dbEntities _nContext = CallContext.GetData("wewinDBContext") as WebApp.Models.dbEntities;
            if (_nContext == null)
            {
                _nContext = new WebApp.Models.dbEntities();

                ////SaveChanges方法之前先关闭验证实体的有效性
                //_nContext.Configuration.ValidateOnSaveEnabled = false;

                CallContext.SetData("wewinDBContext", _nContext);
            }
            return _nContext;
        }
    }
}
